package com.sicheng.蓝桥.国赛准备.第10届CPP;

import java.util.ArrayList;
import java.util.Scanner;

/**
 * @author zsc
 * @version 1.0
 * @date 2022/5/2 17:35
 */
public class G排列数 {
    /**
     * G-排列数：
     * 对于一个数列中的某个数，如果这个数比两侧的数都大或比两侧的数都小，我们称这个数为这个数列的一个转折点。
     * 如果一个数列有t个转折点，我们称这个数列为t+1调数列。
     * 给定两个正整数n,k。求在1~n的全排列中，有多少个数列是k调数列。
     * <p>
     * 输入描述：
     * 两个正整数n,k。
     * <p>
     * 输出描述：
     * 答案，一个整数。
     * <p>
     * 输入样例：
     * 4 2
     * 输出样例：
     * 12
     */
    public static void main(String[] args) {
        solve();
        ArrayList<Integer> integers = new ArrayList<>();
        integers.add(1);
    }

    static int n, k, ans;
    static int[] a;

    static void swap(int x, int y) {
        int t = a[x];
        a[x] = a[y];
        a[y] = t;
    }

    static boolean pd(int x) { //判断a[x]是不是转折点
        return a[x] > a[x - 1] && a[x] > a[x + 1] || a[x] < a[x - 1] && a[x] < a[x + 1];
    }

    static void dfs(int m, int sum) {  //m为递归层数，sum为已经有的转折点数量
        if (m > 2 && pd(m - 2)) //判断a[m-2]是不是转折点
            sum++;
        if (sum > k - 1 || sum + n - m < k - 1) //转折点过多或者过少都剪枝
            return;
        if (m == n - 1) { //全排列递归出口
            if (m > 1 && pd(m - 1))
                sum++;
            if (sum == k - 1)
                ans++;
            return;
        }
        for (int i = m; i < n; i++) { //全排列函数的函数主体
            swap(m, i);
            dfs(m + 1, sum);
            swap(m, i);
        }
    }

    static void solve() {
        Scanner scanner = new Scanner(System.in);
        n = scanner.nextInt();
        k = scanner.nextInt();
        a = new int[n];
        for (int i = 0; i < n; i++)
            a[i] = i + 1;
        dfs(0, 0);
        System.out.println(ans);
    }
}
